home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / include / glib-2.0 / glib / gdate.h < prev    next >
Encoding:
C/C++ Source or Header  |  2006-04-25  |  10.1 KB  |  254 lines

  1. /* GLIB - Library of useful routines for C programming
  2.  * Copyright (C) 1995-1997  Peter Mattis, Spencer Kimball and Josh MacDonald
  3.  *
  4.  * This library is free software; you can redistribute it and/or
  5.  * modify it under the terms of the GNU Lesser General Public
  6.  * License as published by the Free Software Foundation; either
  7.  * version 2 of the License, or (at your option) any later version.
  8.  *
  9.  * This library is distributed in the hope that it will be useful,
  10.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.     See the GNU
  12.  * Lesser General Public License for more details.
  13.  *
  14.  * You should have received a copy of the GNU Lesser General Public
  15.  * License along with this library; if not, write to the
  16.  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  17.  * Boston, MA 02111-1307, USA.
  18.  */
  19.  
  20. /*
  21.  * Modified by the GLib Team and others 1997-2000.  See the AUTHORS
  22.  * file for a list of people on the GLib Team.  See the ChangeLog
  23.  * files for a list of changes.  These files are distributed with
  24.  * GLib at ftp://ftp.gtk.org/pub/gtk/. 
  25.  */
  26.  
  27. #ifndef __G_DATE_H__
  28. #define __G_DATE_H__
  29.  
  30. #include <glib/gquark.h>
  31.  
  32. G_BEGIN_DECLS
  33.  
  34. /* GDate
  35.  *
  36.  * Date calculations (not time for now, to be resolved). These are a
  37.  * mutant combination of Steffen Beyer's DateCalc routines
  38.  * (http://www.perl.com/CPAN/authors/id/STBEY/) and Jon Trowbridge's
  39.  * date routines (written for in-house software).  Written by Havoc
  40.  * Pennington <hp@pobox.com>
  41.  */
  42.  
  43. typedef gint32  GTime;
  44. typedef guint16 GDateYear;
  45. typedef guint8  GDateDay;   /* day of the month */
  46. typedef struct _GDate GDate;
  47. /* make struct tm known without having to include time.h */
  48. struct tm;
  49.  
  50. /* enum used to specify order of appearance in parsed date strings */
  51. typedef enum
  52. {
  53.   G_DATE_DAY   = 0,
  54.   G_DATE_MONTH = 1,
  55.   G_DATE_YEAR  = 2
  56. } GDateDMY;
  57.  
  58. /* actual week and month values */
  59. typedef enum
  60. {
  61.   G_DATE_BAD_WEEKDAY  = 0,
  62.   G_DATE_MONDAY       = 1,
  63.   G_DATE_TUESDAY      = 2,
  64.   G_DATE_WEDNESDAY    = 3,
  65.   G_DATE_THURSDAY     = 4,
  66.   G_DATE_FRIDAY       = 5,
  67.   G_DATE_SATURDAY     = 6,
  68.   G_DATE_SUNDAY       = 7
  69. } GDateWeekday;
  70. typedef enum
  71. {
  72.   G_DATE_BAD_MONTH = 0,
  73.   G_DATE_JANUARY   = 1,
  74.   G_DATE_FEBRUARY  = 2,
  75.   G_DATE_MARCH     = 3,
  76.   G_DATE_APRIL     = 4,
  77.   G_DATE_MAY       = 5,
  78.   G_DATE_JUNE      = 6,
  79.   G_DATE_JULY      = 7,
  80.   G_DATE_AUGUST    = 8,
  81.   G_DATE_SEPTEMBER = 9,
  82.   G_DATE_OCTOBER   = 10,
  83.   G_DATE_NOVEMBER  = 11,
  84.   G_DATE_DECEMBER  = 12
  85. } GDateMonth;
  86.  
  87. #define G_DATE_BAD_JULIAN 0U
  88. #define G_DATE_BAD_DAY    0U
  89. #define G_DATE_BAD_YEAR   0U
  90.  
  91. /* Note: directly manipulating structs is generally a bad idea, but
  92.  * in this case it's an *incredibly* bad idea, because all or part
  93.  * of this struct can be invalid at any given time. Use the functions,
  94.  * or you will get hosed, I promise.
  95.  */
  96. struct _GDate
  97. {
  98.   guint julian_days : 32; /* julian days representation - we use a
  99.                            *  bitfield hoping that 64 bit platforms
  100.                            *  will pack this whole struct in one big
  101.                            *  int
  102.                            */
  103.  
  104.   guint julian : 1;    /* julian is valid */
  105.   guint dmy    : 1;    /* dmy is valid */
  106.  
  107.   /* DMY representation */
  108.   guint day    : 6;
  109.   guint month  : 4;
  110.   guint year   : 16;
  111. };
  112.  
  113. /* g_date_new() returns an invalid date, you then have to _set() stuff
  114.  * to get a usable object. You can also allocate a GDate statically,
  115.  * then call g_date_clear() to initialize.
  116.  */
  117. GDate*       g_date_new                   (void);
  118. GDate*       g_date_new_dmy               (GDateDay     day,
  119.                                            GDateMonth   month,
  120.                                            GDateYear    year);
  121. GDate*       g_date_new_julian            (guint32      julian_day);
  122. void         g_date_free                  (GDate       *date);
  123.  
  124. /* check g_date_valid() after doing an operation that might fail, like
  125.  * _parse.  Almost all g_date operations are undefined on invalid
  126.  * dates (the exceptions are the mutators, since you need those to
  127.  * return to validity).
  128.  */
  129. gboolean     g_date_valid                 (const GDate *date);
  130. gboolean     g_date_valid_day             (GDateDay     day) G_GNUC_CONST;
  131. gboolean     g_date_valid_month           (GDateMonth month) G_GNUC_CONST;
  132. gboolean     g_date_valid_year            (GDateYear  year) G_GNUC_CONST;
  133. gboolean     g_date_valid_weekday         (GDateWeekday weekday) G_GNUC_CONST;
  134. gboolean     g_date_valid_julian          (guint32 julian_date) G_GNUC_CONST;
  135. gboolean     g_date_valid_dmy             (GDateDay     day,
  136.                                            GDateMonth   month,
  137.                                            GDateYear    year) G_GNUC_CONST;
  138.  
  139. GDateWeekday g_date_get_weekday           (const GDate *date);
  140. GDateMonth   g_date_get_month             (const GDate *date);
  141. GDateYear    g_date_get_year              (const GDate *date);
  142. GDateDay     g_date_get_day               (const GDate *date);
  143. guint32      g_date_get_julian            (const GDate *date);
  144. guint        g_date_get_day_of_year       (const GDate *date);
  145. /* First monday/sunday is the start of week 1; if we haven't reached
  146.  * that day, return 0. These are not ISO weeks of the year; that
  147.  * routine needs to be added.
  148.  * these functions return the number of weeks, starting on the
  149.  * corrsponding day
  150.  */
  151. guint        g_date_get_monday_week_of_year (const GDate *date);
  152. guint        g_date_get_sunday_week_of_year (const GDate *date);
  153. guint        g_date_get_iso8601_week_of_year (const GDate *date);
  154.  
  155. /* If you create a static date struct you need to clear it to get it
  156.  * in a sane state before use. You can clear a whole array at
  157.  * once with the ndates argument.
  158.  */
  159. void         g_date_clear                 (GDate       *date,
  160.                                            guint        n_dates);
  161.  
  162. /* The parse routine is meant for dates typed in by a user, so it
  163.  * permits many formats but tries to catch common typos. If your data
  164.  * needs to be strictly validated, it is not an appropriate function.
  165.  */
  166. void         g_date_set_parse             (GDate       *date,
  167.                                            const gchar *str);
  168. void         g_date_set_time              (GDate       *date,
  169.                                            GTime        time_);
  170. void         g_date_set_month             (GDate       *date,
  171.                                            GDateMonth   month);
  172. void         g_date_set_day               (GDate       *date,
  173.                                            GDateDay     day);
  174. void         g_date_set_year              (GDate       *date,
  175.                                            GDateYear    year);
  176. void         g_date_set_dmy               (GDate       *date,
  177.                                            GDateDay     day,
  178.                                            GDateMonth   month,
  179.                                            GDateYear    y);
  180. void         g_date_set_julian            (GDate       *date,
  181.                                            guint32      julian_date);
  182. gboolean     g_date_is_first_of_month     (const GDate *date);
  183. gboolean     g_date_is_last_of_month      (const GDate *date);
  184.  
  185. /* To go forward by some number of weeks just go forward weeks*7 days */
  186. void         g_date_add_days              (GDate       *date,
  187.                                            guint        n_days);
  188. void         g_date_subtract_days         (GDate       *date,
  189.                                            guint        n_days);
  190.  
  191. /* If you add/sub months while day > 28, the day might change */
  192. void         g_date_add_months            (GDate       *date,
  193.                                            guint        n_months);
  194. void         g_date_subtract_months       (GDate       *date,
  195.                                            guint        n_months);
  196.  
  197. /* If it's feb 29, changing years can move you to the 28th */
  198. void         g_date_add_years             (GDate       *date,
  199.                                            guint        n_years);
  200. void         g_date_subtract_years        (GDate       *date,
  201.                                            guint        n_years);
  202. gboolean     g_date_is_leap_year          (GDateYear    year) G_GNUC_CONST;
  203. guint8       g_date_get_days_in_month     (GDateMonth   month,
  204.                                            GDateYear    year) G_GNUC_CONST;
  205. guint8       g_date_get_monday_weeks_in_year  (GDateYear    year) G_GNUC_CONST;
  206. guint8       g_date_get_sunday_weeks_in_year  (GDateYear    year) G_GNUC_CONST;
  207.  
  208. /* Returns the number of days between the two dates.  If date2 comes
  209.    before date1, a negative value is return. */
  210. gint         g_date_days_between          (const GDate *date1,
  211.                        const GDate *date2);
  212.  
  213. /* qsort-friendly (with a cast...) */
  214. gint         g_date_compare               (const GDate *lhs,
  215.                                            const GDate *rhs);
  216. void         g_date_to_struct_tm          (const GDate *date,
  217.                                            struct tm   *tm);
  218.  
  219. void         g_date_clamp                 (GDate *date,
  220.                        const GDate *min_date,
  221.                        const GDate *max_date);
  222.  
  223. /* Swap date1 and date2's values if date1 > date2. */
  224. void         g_date_order                 (GDate *date1, GDate *date2);
  225.  
  226. /* Just like strftime() except you can only use date-related formats.
  227.  *   Using a time format is undefined.
  228.  */
  229. gsize        g_date_strftime              (gchar       *s,
  230.                                            gsize        slen,
  231.                                            const gchar *format,
  232.                                            const GDate *date);
  233.  
  234. #ifndef G_DISABLE_DEPRECATED
  235.  
  236. #define g_date_weekday             g_date_get_weekday
  237. #define g_date_month             g_date_get_month
  238. #define g_date_year             g_date_get_year
  239. #define g_date_day             g_date_get_day
  240. #define g_date_julian             g_date_get_julian
  241. #define g_date_day_of_year         g_date_get_day_of_year
  242. #define g_date_monday_week_of_year     g_date_get_monday_week_of_year
  243. #define g_date_sunday_week_of_year     g_date_get_sunday_week_of_year
  244. #define g_date_days_in_month         g_date_get_days_in_month
  245. #define g_date_monday_weeks_in_year     g_date_get_monday_weeks_in_year
  246. #define g_date_sunday_weeks_in_year    g_date_get_sunday_weeks_in_year
  247.  
  248. #endif /* G_DISABLE_DEPRECATED */
  249.  
  250. G_END_DECLS
  251.  
  252. #endif /* __G_DATE_H__ */
  253.  
  254.